import tkinter as tk
from tkinter import ttk


class App:
    def __init__(self, root):
        self.root = root
        self.root.title("主应用")
        self.root.geometry("500x400")

        # 创建一个框架来包含所有页面
        self.container = tk.Frame(root)
        self.container.pack(fill="both", expand=True)

        # 初始化页面字典
        self.frames = {}

        # 创建页面并添加到字典
        for F in (FirstPage, SecondPage, Threed):
            frame = F(self.container, self)
            self.frames[F] = frame
            # 使用grid布局，所有页面都在同一位置
            frame.grid(row=0, column=0, sticky="nsew")

        # 配置container的grid布局
        self.container.grid_rowconfigure(0, weight=1)
        self.container.grid_columnconfigure(0, weight=1)

        # 显示第一个页面
        self.show_frame(FirstPage)

    def show_frame(self, cont):
        """将指定的页面提升到顶部"""
        frame = self.frames[cont]
        frame.tkraise()

    def destroy_frame(self, frame_class):
        """销毁指定类的页面"""
        if frame_class in self.frames:
            self.frames[frame_class].destroy()
            self.frames.pop(frame_class)
            print(f"Frame {frame_class.__name__} destroyed")


class FirstPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        # 页面标题
        label = tk.Label(self, text="第一个页面", font=("Arial", 18))
        label.pack(pady=10, padx=10)

        # 页面内容
        content = tk.Label(self, text="这是第一个页面的内容")
        content.pack(pady=20)

        # 按钮 - 跳转到第二个页面
        button = ttk.Button(self, text="打开第二个页面",
                            command=lambda: self.controller.show_frame(SecondPage))
        button.pack(pady=20)


class SecondPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        # 页面标题
        label = tk.Label(self, text="第二个页面", font=("Arial", 18))
        label.pack(pady=10, padx=10)

        # 页面内容
        content = tk.Label(self, text="这是第二个页面的内容")
        content.pack(pady=20)

        # 按钮 - 返回第一个页面
        button = ttk.Button(self, text="打开第三个页面",
                            command=lambda: self.controller.show_frame(Threed))
        button.pack(pady=20)


class Threed(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller

        # 页面标题
        label = tk.Label(self, text="第三个页面", font=("Arial", 18))
        label.pack(pady=10, padx=10)

        # 页面内容
        content = tk.Label(self, text="这是第三个页面的内容")
        content.pack(pady=20)

        # 按钮 - 返回第一个页面
        button = ttk.Button(self, text="返回第一个页面",
                            command=lambda: self.controller.show_frame(FirstPage))
        button.pack(pady=20)

        # 按钮 - 返回第二个页面
        button = ttk.Button(self, text="返回第二个页面",
                            command=lambda: self.controller.show_frame(SecondPage))
        button.pack(pady=20)

        # 按钮 - 销毁第一页
        button2 = ttk.Button(self, text="销毁第一个页面",
                             command=lambda: self.controller.destroy_frame(FirstPage))
        button2.pack(pady=20)


# 创建主窗口并运行应用
if __name__ == "__main__":
    root = tk.Tk()
    app = App(root)
    root.mainloop()
